package com.atguigu.srb.core.controller.api;


import com.atguigu.srb.base.result.R;
import com.atguigu.srb.core.pojo.entity.IntegralGrade;
import com.atguigu.srb.core.service.IntegralGradeService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 积分等级表 前端控制器
 * </p>
 *
 * @author Atguigu
 * @since 2023-01-04
 */
@RestController
@RequestMapping("/api/core/integralGrade")
@Api(tags = "积分等级会员模块") //描述controller
public class ApiIntegralGradeController {
    //管理员访问积分等级管理：CRUD 一般要进行权限管理(springsecurity RBAC)
    //会员访问积分等级管理： 只需要查询
    /*
    crud
     */
    @Resource
    IntegralGradeService integralGradeService;
    @ApiOperation("查询会员的积分等级借款额度")
    @GetMapping("/auth/borrowAmount")
    public R getborrowAmount(@RequestHeader(value = "token", required = false)
                             String token){
        return R.ok().data("borrowAmount",integralGradeService.getborrowAmount(token));
    }


    /*
        优化：
           接口测试：
                浏览器默认行为为get，其他的请求方式的接口需要借助其他工具来测试
                    接口路径+参数+返回值  都需要自己拼接分析
                postman：
                jmeter/ab： 压力测试工具
                        qps：压力测试可以得到单位时间内处理请求的响应时间
                            计算程序的吞吐量
                swagger：整合到项目中可以 自动生成接口文档 同时可以测试当前接口



            2、方法返回值 前端使用时无法统一判断成功或失败
                除了错误状态码以外，200的状态码返回的结果也可能是失败的响应
                业务代码执行结果可能是失败的，例如：删除返回false代表失败，根据id查询结果为null代表失败
                统一返回结果：

     */
    //1、查询所有的积分等级
    @ApiOperation(value = "查询所有")
    @GetMapping
    public List<IntegralGrade> list(){
        return integralGradeService.list();
    }
    //2、根据id查询积分等级
    @ApiOperation(value = "根据id查询")
    @GetMapping("{id}") // get +   /integralGrade/{id}
    public IntegralGrade getById(@ApiParam(value = "id" , required = true) @PathVariable("id")String id){
        return integralGradeService.getById(id);
    }
    //3、删除积分等级
    @ApiOperation(value = "根据id删除")
    @DeleteMapping("{id}") // delete +   /integralGrade/{id}
    public Boolean deleteById(@ApiParam(value = "id" , required = true)@PathVariable("id")String id){
        return integralGradeService.removeById(id);
    }

    //通过分页查询 和新增 配置mybatisplus
    //1、打印sql
    //2、分页查询：配置分页拦截器
    //3、自动填充： 新增和更新时希望对时间进行自动填充
    @ApiOperation(value = "分页查询")
    @GetMapping("list/{pageNum}/{pageSize}")
    public Page<IntegralGrade> list(@ApiParam(value = "页码")@PathVariable("pageNum")Integer pageNum,
                                    @ApiParam(value = "每页数量")@PathVariable("pageSize")Integer pageSize){
        return integralGradeService.page(new Page<>(pageNum,pageSize));
    }
    @ApiOperation(value = "新增")
    @PostMapping
    public Boolean save(@RequestBody IntegralGrade integralGrade){
        return integralGradeService.save(integralGrade);
    }
    /*
        jackson对数据转换时会出现格式问题：需要额外配置可以解决
            1、jackson将数据转为json时  时间会-8小时
            2、超过16位长度的id最后的几位会出现精度丢失问题变为0  1610523745351372000
     */
}

